From: Carlos Garnacho Date: Wed, 11 Mar 2020 11:32:07 +0000 (+0100) Subject: St: Ensure to update entry hint visibility with IM preedit X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~751^2^2~144 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=b18469427e5c19402111de5fe9888bceec0eaacd;p=gnome-shell.git St: Ensure to update entry hint visibility with IM preedit Commit 88ac339774 changed StEntry behavior so the text hint would stay visible while focused, as long as the text buffer is empty. However, IMs that use preedit still should count as "started typing", while the text buffer is still officially empty. To fix this, check on st_entry_update_hint_visibility() that there's indeed no preedit buffer before showing the hint. We can't directly listen to internal preedit buffer changes in ClutterText, so handle preedit buffer updates through the ::cursor-changed signal that will be indirectly emitted. https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/1084 --- diff --git a/src/st/st-entry.c b/src/st/st-entry.c index 24fe7434c..28dddc053 100644 --- a/src/st/st-entry.c +++ b/src/st/st-entry.c @@ -232,6 +232,7 @@ st_entry_update_hint_visibility (StEntry *self) StEntryPrivate *priv = ST_ENTRY_PRIV (self); gboolean hint_visible = priv->hint_actor != NULL && + !clutter_text_has_preedit (CLUTTER_TEXT (priv->entry)) && strcmp (clutter_text_get_text (CLUTTER_TEXT (priv->entry)), "") == 0; if (priv->hint_actor) @@ -530,6 +531,13 @@ clutter_text_focus_out_cb (ClutterText *text, clutter_text_set_cursor_visible (text, FALSE); } +static void +clutter_text_cursor_changed (ClutterText *text, + StEntry *entry) +{ + st_entry_update_hint_visibility (entry); +} + static void clutter_text_changed_cb (GObject *object, GParamSpec *pspec, @@ -980,6 +988,9 @@ st_entry_init (StEntry *entry) g_signal_connect (priv->entry, "button-press-event", G_CALLBACK (clutter_text_button_press_event), entry); + g_signal_connect (priv->entry, "cursor-changed", + G_CALLBACK (clutter_text_cursor_changed), entry); + g_signal_connect (priv->entry, "notify::text", G_CALLBACK (clutter_text_changed_cb), entry);